// stdx/ptrx.rs
// CRITICAL: 原始指针与引用转换示例。仅展示安全转换。
// AUTO_COMMENT: 避免 unsafe 使用，展示引用与地址获取。

#[allow(dead_code)]
pub fn stdx_examples_ptrx() {
    let x = 5;
    let r = &x as *const i32;
    // CRITICAL: deref raw pointer 需要 unsafe，示例避免解引用。
    let _ = r;

    // CRITICAL: 引用转指针
    let mut y = 10;
    let const_ptr: *const i32 = &y;
    let mut_ptr: *mut i32 = &mut y;

    // CRITICAL: 指针转引用（unsafe）
    let ref_from_const = unsafe { &*const_ptr };
    let ref_from_mut = unsafe { &mut *mut_ptr };

    // CRITICAL: 指针地址
    let addr_const = const_ptr as usize;
    let addr_mut = mut_ptr as usize;

    // CRITICAL: 指针比较
    let is_same = const_ptr == mut_ptr;

    // CRITICAL: 指针偏移（unsafe）
    let offset_ptr = unsafe { const_ptr.add(1) }; // 假设连续内存

    // CRITICAL: 智能指针示例
    use std::rc::Rc;
    let rc = Rc::new(42);
    let rc_ptr: *const i32 = Rc::as_ptr(&rc);

    // CRITICAL: Box 指针
    let boxed = Box::new(100);
    let box_ptr: *const i32 = &*boxed;

    let _ = (
        ref_from_const,
        ref_from_mut,
        addr_const,
        addr_mut,
        is_same,
        offset_ptr,
        rc_ptr,
        box_ptr,
    );
}
